#include <Wire.h>
#include <Adafruit_INA219.h>

// ESP32C3的I2C引脚定义（可根据实际连接修改）
#define SDA_PIN 21  // GPIO4
#define SCL_PIN 22  // GPIO5

Adafruit_INA219 ina219;

// 电池参数配置（根据你的电池修改）
const float MAX_BATTERY_VOLTAGE = 4.2;  // 满电电压 (LiPo 3.7V电池)
const float MIN_BATTERY_VOLTAGE = 3.0;  // 放空电压

void setup() {
  Serial.begin(115200);
  Serial.println("初始化开始");

  Wire.begin(SDA_PIN, SCL_PIN);
  
  // 添加超时检测
  unsigned long startTime = millis();
  while (!ina219.begin(&Wire)) {
    Serial.println("尝试连接INA219...");
    delay(500);
    
    if (millis() - startTime > 5000) {
      Serial.println("INA219连接超时,进入安全模式");
      break;
    }
  }
  
  // 初始化INA219传感器（仅传递I2C总线参数）
  if (!ina219.begin(&Wire)) {
    Serial.println("无法找到INA219传感器,检查连接!");
    while (1);
  }
  
  // 配置测量范围（根据你的应用调整）
  ina219.setCalibration_32V_2A();
  
  Serial.println("INA219初始化成功!");
}

void loop() {
  // 读取电压（单位：V）
  float shuntvoltage = ina219.getShuntVoltage_mV() / 1000;
  float busvoltage = ina219.getBusVoltage_V();
  float current_mA = ina219.getCurrent_mA();
  float loadvoltage = busvoltage + shuntvoltage;
  
  // 计算电池电量百分比
  float batteryPercentage = map(busvoltage, MIN_BATTERY_VOLTAGE, MAX_BATTERY_VOLTAGE, 0, 100);
  batteryPercentage = constrain(batteryPercentage, 0, 100);  // 限制在0-100%范围内
  
  // 打印测量结果
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" V");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.print("Battery Level: "); Serial.print(batteryPercentage); Serial.println(" %");
  Serial.println("---------------------------");
  
  delay(1000);  // 每秒更新一次
}